import { Context } from "koa";
import menuService from "../service/menu.service";
import { access, sql } from "../logger";
import { callbackData } from "../utils/data.handler";
import { pagination } from "../utils/pagination";

class MenuController {
    async create(ctx:Context){
        //获取数据
        let {parent_id, name, icon, orderNum, path, type, extend, show} = ctx.request.body;
        //操作数据库
        try {
            const res = await menuService.create({ parent_id, name, icon, orderNum, path, type, extend, show });
            // 返回结果
            access.info('菜单添加成功', { name: res.name })
            ctx.body = callbackData('0', '菜单添加成功')
        } catch (err) {
            sql.error('菜单添加失败', err)
            console.error('菜单添加失败', err)
            ctx.app.emit('error', callbackData('3', '菜单添加失败'), ctx);
        }
    }
    async delete(ctx:Context){
        let { ids = '' } = JSON.parse(JSON.stringify(ctx.query));
        if (!ids) {
            access.error('请选择删除菜单')
            console.error('请选择删除菜单')
            ctx.app.emit('error', callbackData('1', '请选择删除菜单'), ctx);
            return false;
        }
        try {
            let idBox = ids.split(',');
            await menuService.delete(idBox)
            // 返回结果
            sql.info('删除菜单成功', { ids })
            ctx.body = callbackData('0', '删除菜单成功')
        } catch (err) {
            sql.error('删除菜单失败', err)
            console.error('删除菜单失败', err)
            ctx.app.emit('error', callbackData('3', '删除菜单失败'), ctx);
        }
    }

    async update(ctx:Context){
        const { id,name,icon,path,show,orderNum,type,extend } = ctx.request.body;
        if (!id) {
            access.error('请选择更新菜单')
            console.error('请选择更新菜单')
            ctx.app.emit('error', callbackData('1', '请选择更新菜单'), ctx);
            return false;
        }
        // 操作数据库
        try {
            await menuService.update({ id,name,icon,path,show,orderNum,type,extend });
            // 返回结果
            access.info('更新菜单成功', { name,path })
            ctx.body = callbackData('0', '更新菜单成功')
        } catch (err) {
            sql.error('更新菜单失败', err)
            console.error('更新菜单失败', err)
            ctx.app.emit('error', callbackData('3', '更新菜单失败'), ctx);
        }
    }

    queryList = async(ctx:Context)=>{
        //获取数据
        const { id = '', parent_id = '-1', name = '', path = '',show=true } = JSON.parse(JSON.stringify(ctx.query)) || {};
        const { page = 1, size = 10 } = ctx.request.body;
        try {
            const res = await menuService.getList({ id, parent_id, name, path,show, size, page })
            // 返回结果
            if (res) {
                let count = 0;
                let rows = [];
                let list = []
                if (page && size) {
                    count = res.count;
                    rows = res.rows;
                } else {
                    rows = res;
                }
                if (rows.length) {
                    list = await this.getAll(rows);
                }
                sql.info('查询成功', { name, page, size })
                ctx.body = callbackData('0', '查询成功', (page && size) ? pagination(rows, page, count, size) : list)
                return (page && size) ? pagination(rows, page, count, size) : list
            } else {
                sql.error('菜单列表查询失败', { name, page, size, path })
                console.error('菜单列表查询失败', { name, page, size, path })
                ctx.app.emit('error', callbackData('3', '菜单列表查询失败'), ctx);
            }
        } catch (err) {
            sql.error('菜单列表查询失败', err)
            console.error('菜单列表查询失败', err)
            ctx.app.emit('error', callbackData('3', '菜单列表查询失败'), ctx);
        }
    }

    //根据id 状态查询所有
    getAll = (data) => {
        if (data && data.length) {
            var promiseBox = data.map(async (item: { children?: any; id?: any; }) => {
                let { id } = item
                let children = await menuService.getList({ parent_id: id });
                if (children && children.length) {
                    item.children = await this.getAll(children)
                } else {
                    item.children = null;
                }
                return item;
            })
            return Promise.all(promiseBox).then(res=>{
                return res;
            })
        }
    }
}

export default new MenuController